package com.base.web.core.util.jedis.impl;

import com.base.web.core.util.jedis.JedisService;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.JedisCluster;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created with IntelliJ IDEA.
 * Description: redis集群操作实现
 *
 * @Author: RenTie
 * @Date: 2018-08-16 16:27
 **/
//@Service("JedisClusterServiceImpl")
public class JedisClusterServiceImpl implements JedisService {

    @Autowired
    private JedisCluster jedisCluster;

    /**
     * 保存数据到缓存
     *
     * @param key
     * @param value
     * @return
     */
    @Override
    public Boolean set(String key, String value) {
        jedisCluster.set(key, value);
        return exists(key);
    }

    /**
     * 保存数据到缓存并设置过期时间
     *
     * @param key
     * @param time
     * @param value
     * @return
     */
    @Override
    public Boolean setex(String key, int time, String value) {
        jedisCluster.set(key, value);
        if (time > 0) {
            expire(key, time);
        }
        return exists(key);
    }

    /**
     * 获得缓存值
     *
     * @param key
     * @return
     */
    @Override
    public String get(String key) {
        return jedisCluster.get(key);
    }

    /**
     * 删除键
     *
     * @param key
     * @return
     */
    @Override
    public Boolean del(String key) {
        return jedisCluster.del(key) > 0L;

    }

    /**
     * 设置某个缓存的过期时间（以秒为单位）
     *
     * @param key  键值
     * @param time 缓存时间
     */
    @Override
    public Boolean expire(String key, int time) {
        return jedisCluster.expire(key, time) > 0L;
    }

    /**
     * 移除给定key过期时间(设置这个key永不过期)
     *
     * @param key
     */
    @Override
    public Boolean persist(String key) {
        return jedisCluster.persist(key) > 0L;
    }

    /**
     * 判断某个键是否存在
     *
     * @param key
     * @return
     */
    @Override
    public Boolean exists(String key) {
        return jedisCluster.exists(key);
    }

    /**
     * 查找特定的key(*为查找所有)
     *
     * @param key
     * @return
     */
    @Override
    public Set<String> keys(String key) {
        return null;
    }

    /**
     * 返回key所储存的值的类型
     *
     * @param key
     * @return
     */
    @Override
    public String type(String key) {
        return jedisCluster.type(key);
    }

    /**
     * 清空所有数据库的key
     */
    @Override
    public Boolean flushAll() {
        return false;
    }

    /**
     * 清空当前数据库的key
     */
    @Override
    public Boolean flushDB() {
        return false;
    }

    /**
     * 返回key的个数
     *
     * @return
     */
    @Override
    public Long dbSize() {
        return 0L;
    }

    /**
     * List操作 左入栈
     *
     * @param key
     * @param value
     */
    @Override
    public Boolean lpush(String key, String... value) {
        return jedisCluster.lpush(key, value) > 0L;
    }

    /**
     * List操作 左出栈
     *
     * @param key
     * @return
     */
    @Override
    public String lpop(String key) {
        return jedisCluster.lpop(key);
    }

    /**
     * List操作  右入栈
     *
     * @param key
     * @param value
     */
    @Override
    public Boolean rpush(String key, String... value) {
        return jedisCluster.rpush(key, value) > 0L;
    }

    /**
     * List操作  右出栈
     *
     * @param key
     * @return
     */
    @Override
    public String rpop(String key) {
        return jedisCluster.rpop(key);
    }

    /**
     * 获得List元素个数
     *
     * @param key
     * @return
     */
    @Override
    public Long llen(String key) {
        return jedisCluster.llen(key);
    }

    /**
     * Set操作 set添加一个或多个数据
     *
     * @param key
     * @param value
     */
    @Override
    public Boolean sadd(String key, String... value) {
        return jedisCluster.sadd(key, value) > 0L;
    }

    /**
     * Set操作 获得所有元素
     *
     * @param key
     * @return
     */
    @Override
    public Set<String> smembers(String key) {
        return jedisCluster.smembers(key);
    }

    /**
     * 删除set中指定一个或多个元素
     *
     * @param key
     * @param value
     */
    @Override
    public Boolean srem(String key, String... value) {
        return jedisCluster.srem(key, value) > 0L;
    }

    /**
     * 随机Set中的一个元素
     *
     * @param key
     */
    @Override
    public String spop(String key) {
        return jedisCluster.spop(key);
    }

    /**
     * 获得Set中的元素个数
     *
     * @param key
     * @return
     */
    @Override
    public Long scard(String key) {
        return jedisCluster.scard(key);
    }

    /**
     * 散列hash保存Map
     *
     * @param key
     * @param map
     */
    @Override
    public Boolean hmset(String key, Map<String, String> map) {
        jedisCluster.hmset(key, map);
        return exists(key);
    }

    /**
     * 散列hash 单个值保存
     *
     * @param key   缓存键值
     * @param field 映射表键
     * @param value 映射表值
     */
    @Override
    public Boolean hset(String key, String field, String value) {
        return jedisCluster.hset(key, field, value) > 0L;
    }

    /**
     * 散列hash获得所有键值对
     *
     * @param key
     * @return
     */
    @Override
    public Map<String, String> hgetAll(String key) {
        return jedisCluster.hgetAll(key);
    }

    /**
     * 散列hash获得所有键
     *
     * @param key
     * @return
     */
    @Override
    public Set<String> hkeys(String key) {
        return jedisCluster.hkeys(key);
    }

    /**
     * 散列hash获得所有值
     *
     * @param key
     * @return
     */
    @Override
    public List<String> hvals(String key) {
        return jedisCluster.hvals(key);
    }

    /**
     * 删除一个或多个键值对
     *
     * @param key   缓存键
     * @param field 映射表键
     */
    @Override
    public Boolean hdel(String key, String... field) {
        return jedisCluster.hdel(key, field) > 0L;
    }

    /**
     * 判断hash中是否存在某个键值对
     *
     * @param key   缓存键
     * @param field 映射表键
     * @return
     */
    @Override
    public Boolean hexists(String key, String field) {
        return jedisCluster.hexists(key,field);
    }

    /**
     * 获取hash中的指定键值
     *
     * @param key   缓存键
     * @param field 映射表键
     * @return
     */
    @Override
    public List<String> hmget(String key, String... field) {
        return jedisCluster.hmget(key,field);
    }
}
